תכנות בשפת C פרק שלישי: בקרת זרימה שייקה בילו יועץ ומרצה בכיר למדעי המחשב וטכנולוגית מידע מומחה למערכות מידע חינוכיות, אקדמיות ומנהליות
תזכורת: שימוש במשתנים מהו משתנה הגדרת משתנים ;int i ; char c= a קלט/פלט של משתנים. d,%f, %g, %e, %c, %lf% פורמטים: % ); printf( %g, average); scanf( %lf, &num פעולות על משתנים.; c = a; b=5 השמה: פעולות חשבון:,+,-,*,/.% תשומת-לב לדיוק וטווח. למשל 0=3/4. להקפיד לא לחלק באפס (זה גורם לתוכנית לעוף). Shayke Bilu 2
תזכורת: דוגמא להדפסת משתנים #include <stdio.h> int main() { double a,b,c; } a = 2.51; b = 2; c = a*b; a printf( %g * %g = %g\n", a,b,c); return 0; = 2 5.022.51 הפלט: 2.51 Shayke Bilu 3 *
תזכורת: תוכנית לתרגום מפרנהייט לצלזיוס #include <stdio.h> int main() { double cels, fahr; printf("please enter a fahrenheit temperature:\n"); scanf("%lf", f",&fahr); fahr); הגדרת המשתנים קליטת ערך למשתנה הדפסת התוצאה cels = 5*(fahr-32)/9; printf("this is equal to %f degrees celsius\n", cels); Shayke Bilu 4
עיגול בהדפסת משתנים כשמדפיסים מספר ממשי ניתן לציין את מספר 4f.% הספרות שיודפסו אחרי הנקודה. למשל: במידת הצורך יתבצע עיגול. למשל: printf( %.2f.2f, 123.456); 123.46 יודפס Shayke Bilu 5
הטיפוסchar תזכורת: כמספר (תו) נשמר בזיכרון המחשב char גםם ה- ASCII טבלת הקומפיילר מתרגם מתו למספר באמצעות כל מה שצריך לזכור בקשר לטבלה: כל תו שאפשר להדפיס נמצא בטבלה (גם רווח ו- ( n\ האותיות האותיות נמצאות בטבלה לפי הסדר A - Z' נמצאות בטבלה לפי הסדר a - z' הספרות '0'-'9' נמצאות גם הן לפי הסדר Shayke Bilu 6
תזכורת: תווים כמספרים #include<stdio.h> int main() { char i = A'; זה כמו 65=i ;char printf( i as a character is: %c\n", i); printf("i as an integer is: %d\n", i); printf("the character after %c is: %c\n", i, i+1); i as a character is: A i as a number is: 65 The character after A is: B } return 0; Shayke Bilu 7
ב- scanf למה בעצם צריך & הסימון & משמעותו הכתובת של המשתנה בזיכרון. כלומר, המקום שאליו הקלט צריך להיכנס scanf( %d %lf, student_num, average); טעות!!! יכתוב בכתובות הלא נכונות student_num address: 1760 average address: 7510 Shayke Bilu 8
ב- scanf למה בעצם צריך & הסימון & משמעותו הכתובת של המשתנה בזיכרון להיכנס כלומר, המקום שאליו הקלט צריך scanf( %d %lf, &student_num, &average); תקין! יכתוב בכתובות 1760 ו- 7510 student_num 17 address: 1760 average 85 address: 7510 Shayke Bilu 9
scanf נקודות נוספות לגבי Shayke Bilu 10 כשקולטים מספרים: שיפריד בין המספרים. white המחשב מצפה ל- space רווח, טאב, שורה חדשה... המספרים. בקריאת white ידלג על ה- space scanf מספרים מופרדים ע"י scanf( %d%d,&i,&j); 12 34 white space 12 34 מספרים מופרדים ע"י white space 12,34 מספרים מופרדים ע"י סימן, scanf( %d,%d,&i,&j); 12+ 34 מספרים מופרדים ע"י סימן + scanf( %d %d,&i,&j); scanf( %d + %d,&i,&j);
scanf נקודות נוספות לגבי כשקולטים תווים: רווחים נחשבים לחלק מהקלט. scanf( %c%c,&i,&j); תווים המופיעים ברצף ab scanf( %c %c,&i,&j); תווים מופרדים ע"י רווח a b Shayke Bilu 11
scanf נקודות נוספות לגבי אם הקלדנו יותר ערכים ממה שהפונקציה ציפתה התווים הבאים ישמשו כקלט ל- הבא. scanf scanf( %d, &i); 12 34 scanf( %d, &j); Shayke Bilu 12 אם הקלדנו בין שתי פקודות קלט של תווים Enter התו השני שיקרא הוא תו ירידת-השורה ('('\n'). scanf( %c, &tav1); a scanf( %c, &tav2); מכיל tav1 עכשיו נוסף). מכיל tav2 ו- a n\ (לא נוכל להכניס תו
scanf נקודות נוספות לגבי אם רוצים לקלוט מספר תווים ברצף: אפשר לכתוב את כולם בשורה אחת ובסוף להקליד.Enter scanf( %c, &tav1); ab scanf( %c, &tav2); המפרידים בין התווים. לדלג על סימני ה-\ n או לגרום ל- scanf scanf( %c, &tav1); a scanf( \n \n%c, &tav2); b Shayke Bilu 13 מכיל tav1 עכשיו מכיל tav2 ו- a. b
אפשרות נוספת לקלט/פלט של תווים הפונקציה :()getchar קולטת תו מהמשתמש. שקול ל: ;(scanf( %c, &character הפונקציה :()putchar מדפיסה תו למסך. שקול ל: ;(printf( %c, character white spaces (טאב,רווח,ירידת שורה) Shayke Bilu 14 נחשבים כתווים רגילים עבור הפונקציות הללו
שאלות נוספות על השיעור הקודם?
עוד על משתנים רישום מקוצר של פעולות חשבון עוד קצת על טיפוסי משתנים Shayke Bilu 16
כתיבה מקוצרת של פעולות ;a += 2 ;b -= 3 ;c *= 4 ;d /= 5 ;e %= 5 ;a = a + 2 ;b = b - 3 ;c = c * 4 ;d = d / 5 ;e = e % 5 Shayke Bilu 17
כתיבה מקוצרת של פעולות ++;f ;f = f + 1 קודם נבצע את הפעולה ואח"כ נקדם את ערך המשתנה ב- 1 : j שווה ל- 5. i שווה ל- 6. ;i = 5 ++;j = i ;f++ ;f = f + 1 ואח"כ נבצע את קודם נקדם את ערך המשתנה ב- 1 הפעולה: j שווה ל- 6. i שווה ל- 6. ;i = 5 ;j = ++i Shayke Bilu 18
כתיבה מקוצרת של פעולות --;g ;g = g - 1 קודם נבצע את הפעולה ואח"כ נוריד את ערך המשתנה ב- :1 j שווה ל- 5. i שווה ל- 4. ;i = 5 --;j = i ;g-- ;g = g - 1 ואח"כ נבצע את קודם נוריד את ערך המשתנה ב- 1 הפעולה: j שווה ל- 4. i שווה ל- 4. ;i = 5 ;j = --i Shayke Bilu 19
ייצוג ערכי משתנים במחשב המחשב מכיר רק מספרים. המחשב מבין רק את שפת ה- 0,1. ערכם של משתנים מיוצג כמספר שהמחשב מבין Shayke Bilu 20
ייצוג מספר בעזרת בסיס (10 0 ) 10 בסיס אחדות הספרה הימנית ביותר מייצגת (10 עשרות ) 1 הספרה הבאה מייצגת מאות ) 2 (10 הספרה הבאה 56023 בבסיס 10 5 5*10 4 6 6*10 3 0 0*10 2 2 2*10 1 3 3*10 0 Shayke Bilu 21
ייצוג מספר בעזרת בסיס 2 25 בבסיס 1 1*2 4 בבסיס 2 ו- 1. יש רק שתי ספרות: 0 כל ספרה מייצגת חזקה של 1 1*2 3.2 0 0*2 2 0 0*2 1 1 1*2 0 סימן +) (- Shayke Bilu 22 נקבע ע"י הביט הראשון מספר ממשי מיוצג ע"י שני מספרים שלמים
ייצוג בינארי במחשב - ספרה בינארית בודדת שמיניית ביטים. - משתמש בבייט אחד של זיכרון. char ברוב הקומפיילרים תופס - float בתים 4 bit byte ו- int בתים ברוב הקומפיילרים תופס 8 - double ( בייטים KiloByte 2 10 (=1024 קילו בייטים MegaByte 2 10 מגה בייטים GigaByte 2 10 Shayke Bilu 23
משתנים ללא סימן unsigned מוסיפים בהגדרה משמש למספרים חיוביים בלבד!!! מגדיל את הטווח פי 2 ; unsigned int i=3999999999 ההדפסה נעשית עם %u Shayke Bilu 24
משתנים קבועים משמשים לערך שאינו משתנה במהלך התכנית למשל - π חוסך חזרה על מספרים מונע שינוי הערך בטעות בהגדרה const מוסיפים ; const double pai=3.141592654 Shayke Bilu 25
טיפוסים בסיסיים נוספים מספר שלם long בתים בדרך כלל תופס 8 מספר שלם short בתים בזיכרון) 2) 2 15 - לבין 2 15 בדרך-כלל בין מאפשר לחסוך זיכרון כשעובדים עם מספרים קטנים. מספר ממשי עם דיוק וטווח גדולים יותר long double בתלות במחשב ובקומפיילר. השימוש בטיפוסים אלה פחות נפוץ. Shayke Bilu 26
שאלות נוספות על משתנים?
בקרת זרימה
מה לדעתכם עושה התוכנית הבאה? #include <stdio.h> int main() { קלוט 2 מספרים שלמים מהמשתמש int a, b, max; scanf( %d%d, &a, &b); ייתבצע רק אם התנאי מתקיים max = a; if (max < b) max = b; printf( The maximum is %d\n, max); Shayke Bilu 29 return 0; הדפס את המספר הגדול יותר למסך
מה זאת בקרת זרימה? באופן רגיל, תוכנית מתבצעת שורה-אחרי-שורה לפי הסדר לפעמים נרצה שהפקודות שיבוצעו יקבעו ע"י הקלט (או ע"י חישובים אחרים בתכנית): יתבצע רק אם תנאי כלשהו מתקיים יתבצע רק אם התנאי לא מתקיים )if ( condition }...... { else }...... { Shayke Bilu 30
בקרת זרימה נושאים if-else משפטי תנאים אפשריים שילוב של תנאים switch משפטי Shayke Bilu 31
if פקודת מאפשר לבצע פקודה (או קבוצת פקודות) כתלות בתנאי מסוים. המבנה: if תנאי) פקודה ( ; if (i % 2 == 0) printf ( i is even ); למשל: Shayke Bilu 32
בקרת זרימה - דוגמא #include <stdio.h> int main() { int a, b, max; scanf( %d%d, &a, &b); max = a; if (max < b) if max = b; הפקודה הבאה מתבצעת רק אםb max < printf( The maximum is %d\n, max); Shayke Bilu 33
איזה תנאים אפשר לבטא פעולות השוואה רגילות: > < >= <= )if (a == b );printf( the same numbers\n )if (a!= b );printf( not the same numbers\n שוויון: Shayke Bilu 34 == שוני:
ifהמשך - משפט קבוצת פקודות: אפשר גם להתנות ביצוע של )תנאי)) if { פקודות } Shayke Bilu 35
if-else משפט ניתן לציין גם פקודה (או פקודות) if אחרי משפט מתקיים: שתתבצע במקרה שהתנאי לאא if ( תנאי)פקודה ; else פקודה; if (i % 2 == 0) printf ( i is even ); else printf( i is odd ); למשל: Shayke Bilu 36
if-else משפט של פקודות, נשתמש בסוגריים קבוצה עבור מסולסלים. else { פקודות } Shayke Bilu 37
תנאים מורכבים קינון תנאים לפעמים נדרשים תנאים מורכבים. ציון צריך להיות גדול או שווה ל- 0..100 ציון צריך להיות קטן או שווה ל- if (grade >= 0) if (grade <= 100) printf( The grade is in range\n ); Shayke Bilu 38
שילוב תנאים - פעולות לוגיות יש 33 ש בפעולות לוגיות, שיכולות לשלב בהרבה מקרים נוח להשתמש כמה תנאים. AND, OR, NOT פעולות לוגיות: (וגם) דורש ששני התנאים יתקיימו AND - && if ((grade >= 0) && (grade <= 100)) if (grade >= > 0) if (grade <= 100) Shayke Bilu 39
פעולות לוגיות - דוגמא #include <stdio.h> int main() תוכנית לחישוב ציון סופי בקורס { double exam, exercises, final; printf( Enter your exam grade and exercise grade ); scanf( %lf %lf, &exam, &exercises); if ((exam >= 60) && (exercises >= 60)) { } else final = 0.8 * exam + 0.2 * exercises; printf( You passed your grade is %g \n, final); מניחים כאן שהקלט תקין. בדרך-כלל דווקא נרצה לבדוק את תקינות הקלט ולפעול אחרת אם הקלט לא תקין (למשל לתת הודעה למשתמש ולסיים). Shayke Bilu 40
שילוב תנאים - פעולות לוגיות נוספות התנאים שלפחות אחד (או) - דורש if ((a>5) (a<-5)) OR- יתקיים (שלילה) - דורש שהתנאי יתקיים. לאא NOT -! if (a>5) if (!(a<=5)) סדר הקדימות הוא: יבוצע ראשון). NOT, AND, OR (NOT Shayke Bilu 41
תנאים כמספרים מתורגם ע"י המחשב תנאי.false) לא נכון (0 מספר שונה מ- true) נכון ) לערך מספרי:.0 (4<3) מתורגם לערך 0. ערך מספרי: במקום תנאי ניתן לרשום ביטוי שיש לו ערך - התנאי לא מתקיים.(false)) 0 כל ערך אחר - התנאי מתקיים.(true)) (if(0 למשל, המשמעות של לא תבוצע. היא שהפקודה Shayke Bilu 42
תנאים - המשך? בדיוק כמו (a!=0) if (if (a מה המשמעות של מה המשמעות של? (if (a=5 ששווה לערך כשרושמים פקודת השמה, מתקבל ערך ששמנו במשתנה. לכן הערך של ((5=a) הוא 5 כלומר, תנאי שתמיד מתקיים! == במקום שימו לב לא לרשום = Shayke Bilu 43
פעולות לוגיות על מספרים דוגמא X = 0; Y = 1; Z = 1; מה יודפס בקטע התוכנית הבא? if (X && Y Z) printf( True\n ); else X&&Y printf( False\n ); 0&&1 0. 1 קודם מבוצע ה- :AND 0 Z 0 1 1 2. אחרי זה מבוצע ה- :OR אם סדר הפעולות היה משתנה ע"י סוגריים: (X && (Y Y Z)) Z ) (0 && (1 1)) 0 Shayke Bilu 44
פעולות לוגיות עוד על סדר הביצוע סדר הפעולות: ל-! (not)) יש את הקדימות הגבוהה ביותר. אחרי כן הפעולות אריתמטיות.(%,/,*,-,+) וכו'). < אחריהן פעולות ההשוואה ((==, ו- && ולבסוף, פעולות לוגיות. דוגמאות לתנאים: (5+4>8) 9>8 1 0 >= 0 1 1 1 1 Shayke Bilu 45
סיכום-ביניים מהי בקרת זרימה משפטי if-else תנאים לוגיים פעולות לוגיות שאלות?
בחירה בין יותר משני מצבים כשיש בחירה בין מצבים רבים אפשר לרשום: if ( תנאי) פקודה else if תנאי)תנאי)) פקודה else if תנאי)תנאי)) פקודה else פקודה (כל פקודה יכולה להיות בלוק של פקודות בתוספת סוגריים מסולסלים) Shayke Bilu 47
בחירה בין יותר משני מצבים Shayke Bilu 48 לפי סדר קירבה if -ים ים מתייחסים ל- ה- else אחורה). למשל: (מה- else בשביל הקריאות נדאג ש- else if תנאי)) פקודה else if תנאי)תנאי)) if תנאי)תנאי)) פקודה else פקודה else פקודה יופיע מתחת ל- if התואם
בחירה בין יותר משני מצבים - דוגמא תרגום לציון אמריקאי if (grade >= 90) printf( A\n ); else if (grade >= 80) printf( B\n ); else if (grade >= 70) else?90?80 printf( C\n ); האם הציון מעל printf( Failed\n ); האם הציון מעל האם הציון מעל 70? Shayke Bilu 49
SWITCH בחירה בין יותר משני מצבים - קבועים, קיימת אם התנאים הם השוואה לערכים פקודה נוחה יותר,switch ולאחר מכן קודם נדגים שימוש בפקודת נתאר את חלקיה השונים Shayke Bilu 50
switchדוגמא - char grade; scanf( %c, &grade); switch (grade) מה עושה קטע התוכנית הזה? מתרגם ציון אמריקאי לטווח מספרים { case A : printf( 90 100\n ); break; case B : printf( 80 89\n ); break; Shayke Bilu 51 case C :
switchדוגמא: תרגום ציון אמריקאי - char grade; scanf( %c, &grade); הביטוי שערכו נבדק הוא יכול להיות כל ביטוי מטיפוס בדיד (תו או מספר שלם). switch (grade) { case A : printf( 90 100\n ); break; case B : printf( 80 89\n ); break; Shayke Bilu 52 case C :
switchדוגמא: תרגום ציון אמריקאי - char grade; scanf( %c, &grade); switch (grade) { הביטוי שערכו נבדק הוא יכול להיות כל ביטוי מטיפוס בדיד (תו או מספר שלם). הבדיקה היא אם הביטוי הנ"ל שווה לאחד מהקבועים הרשומים (לפי הסדר) case A : printf( 90 100\n ); break; case B : printf( 80 89\n ); break; Shayke Bilu 53 case C :
switchדוגמא: תרגום ציון אמריקאי - char grade; scanf( %c, &grade); switch (grade) { case A : printf( 90 100\n ); break; הביטוי שערכו נבדק הוא יכול להיות כל ביטוי מטיפוס בדיד (תו או מספר שלם). הבדיקה היא אם הביטוי הנ"ל שווה לאחד מהקבועים הרשומים (לפי הסדר) אם נמצא שוויון, כל הפקודות משם ועד סוף ה- switch מבוצעות (אפשריים גם בלוקים של פקודות) case B : printf( 80 89\n ); break; Shayke Bilu 54 case C :
switchדוגמא: תרגום ציון אמריקאי - char grade; scanf( %c, &grade); switch (grade) { case A : printf( 90 100\n ); break; case B : printf( 80 89\n ); הביטוי שערכו נבדק הוא יכול להיות כל ביטוי מטיפוס בדיד (תו או מספר שלם). הבדיקה היא אם הביטוי הנ"ל שווה לאחד מהקבועים הרשומים (לפי הסדר) אם נמצא שוויון, כל הפקודות משם ועד סוף ה- switch מבוצעות אפשריים גם בלוקים של פקודות)) אם מופיעה הפקודה break קופצים לפקודה הראשונה שאחרי ה- switch break; case C : Shayke Bilu 55
switchדוגמא: תרגום ציון אמריקאי - char grade; scanf( %c, &grade); switch (grade) { הביטוי שערכו נבדק הוא יכול להיות כל ביטוי מטיפוס בדיד (תו או מספר שלם). הבדיקה היא אם הביטוי הנ"ל שווה לאחד מהקבועים הרשומים (לפי הסדר) אם נמצא שוויון, כל הפקודות משם ועד סוף ה- switch מבוצעות אפשריים גם בלוקים של פקודות)) אם מופיעה הפקודה break קופצים לפקודה הראשונה שאחרי ה- switch case A : printf( 90 100\n ); break; case B : printf( 80 89\n ); break; case C : default מבוצע אם לא נמצאה אף התאמה (אופציונאלי) Shayke Bilu 56
switch מבנה כללי של בדיד תוצאתו היא מס' שלם או תו switch ביטוי בדיד)) { קבוע 1 : case פקודה או פקודות break; (אופציונלי) קבוע 2 פקודה או פקודות break; (אופציונלי) (אופציונלי) case :.. default: פקודה או פקודות Shayke Bilu 57
switch מבנה כללי של כשנרצה לעשות אותו דבר בכמה מקרים. לדוגמא: break לא נשים switch (tav) { case 0 : case 2 : case 4 : case 6 : השורה תבוצע אם התו הוא סיפרה זוגית case 8 : case 1 : case 3 : case 5 : printf( It s an even digit\n ); break; השורה תבוצע אם התו הוא סיפרה אי-זוגית בכל מקרה אחר Shayke Bilu 58
נקודה לתשומת לב הן מילים בשפת C. מילים שמורות. if, else, switch כגון: להשתמש בהן כשמות משתנים או פונקציות. אסור Shayke Bilu 59
סיכום דיברנו היום על: מהי בקרת זרימה משפטי if-else תנאים לוגיים פעולות לוגיות פקודת switch
קורס תכנות שיעור שלישי שאלות נוספות?